home *** CD-ROM | disk | FTP | other *** search
- /* management and computional support for jupiter's detail menu.
- */
-
- #include <math.h>
- #include "astro.h"
- #include "circum.h"
- #include "screen.h"
-
- altj_labels()
- {
- static char grs[] = "(GRS is at approximately 30 degs in System II)";
-
- f_string (R_ALTM, C_ALTMV, " Jupiter Aux");
-
- f_string (R_JCML, 6, "Central Meridian Longitude (degs):");
- f_string (R_JCML, 51, "(Sys I)");
- f_string (R_JCML, 68, "(Sys II)");
- f_string (R_JCML+1, (NC-sizeof(grs))/2, grs);
-
- f_string (R_IO, C_JMNAMES, "I Io");
- f_string (R_EUROPA, C_JMNAMES, "II Europa");
- f_string (R_GANYMEDE, C_JMNAMES, "III Ganymede");
- f_string (R_CALLISTO, C_JMNAMES, "IV Callisto");
- f_string (R_JCOLHDNGS-1,C_JMY-2, "Jupiter Radii");
- f_string (R_JCOLHDNGS, C_JMX+1, "X (+E)");
- f_string (R_JCOLHDNGS, C_JMY+1, "Y (+S)");
- f_string (R_JCOLHDNGS, C_JMZ-2, "Z (+towards)");
- f_string (R_JMAP+1, 2, "West");
- f_string (R_JMAP+1, NC-5, "East");
- }
-
- /* display jupiter's details. */
- /* ARGSUSED */
- altj_display (force, np)
- int force; /* whether to print for sure or only if things have changed */
- Now *np;
- {
- #define NJM 5 /* number of moons, plus + for Jupiter itself */
- #define NORM 26.6 /* max callisto orbit radius; used to normalize */
- static char fmt[] = "%7.3f";
- struct moonxlocs {
- double x;
- char mid;
- } raw_ml[NJM], sorted_ml[NJM];
- int nml; /* number of sorted_ml[] elements in use */
- char buf[NC];
- double iy, ey, gy, cy;
- double iz, ez, gz, cz;
- double sIcml, sIIcml;
- int i;
-
- /* compute jupiter info.
- * put moons' x loc into raw_ml[] so it can be sorted for graphic.
- */
- jupinfo (mjd, &raw_ml[0].x, &raw_ml[1].x, &raw_ml[2].x, &raw_ml[3].x,
- &iy, &ey, &gy, &cy, &iz, &ez, &gz, &cz, &sIcml, &sIIcml);
-
- f_double (R_JCML, C_JCMLSI, fmt, sIcml);
- f_double (R_JCML, C_JCMLSII, fmt, sIIcml);
- f_double (R_IO, C_JMX, fmt, raw_ml[0].x);
- f_double (R_EUROPA, C_JMX, fmt, raw_ml[1].x);
- f_double (R_GANYMEDE, C_JMX, fmt, raw_ml[2].x);
- f_double (R_CALLISTO, C_JMX, fmt, raw_ml[3].x);
- f_double (R_IO, C_JMY, fmt, iy);
- f_double (R_EUROPA, C_JMY, fmt, ey);
- f_double (R_GANYMEDE, C_JMY, fmt, gy);
- f_double (R_CALLISTO, C_JMY, fmt, cy);
- f_double (R_IO, C_JMZ, fmt, iz);
- f_double (R_EUROPA, C_JMZ, fmt, ez);
- f_double (R_GANYMEDE, C_JMZ, fmt, gz);
- f_double (R_CALLISTO, C_JMZ, fmt, cz);
-
- raw_ml[0].mid = 'I';
- raw_ml[1].mid = 'E';
- raw_ml[2].mid = 'G';
- raw_ml[3].mid = 'C';
- raw_ml[4].x = 0.0;
- raw_ml[4].mid = 'J';
-
- /* insert in increasing order into sorted_ml[]
- */
- nml = 0;
- for (i = 0; i < NJM; i++) {
- int j;
- /* exit loop with next sort_ml location to use at index j+1 */
- for (j = nml; --j >= 0; )
- if (raw_ml[i].x < sorted_ml[j].x)
- sorted_ml[j+1] = sorted_ml[j];
- else
- break;
- sorted_ml[j+1] = raw_ml[i];
- nml++;
- }
-
- /* blank-fill and terminate buf */
- (void) sprintf (buf, "%*s", NC-1, "");
-
- /* convert to screen columns, maintaining correct left-to-right
- * order based on x when there are collisions.
- */
- for (i = 0; i < NJM; i++) {
- int col = (int)(NC/2-1 + (NC/2-1)*sorted_ml[i].x/NORM + 0.5);
- while (buf[col] != ' ')
- col++;
- buf[col] = sorted_ml[i].mid;
- }
-
- f_string (R_JMAP, C_JMAP, buf);
- }
-
- #define dsin(x) sin(degrad(x))
- #define dcos(x) cos(degrad(x))
-
- /* given a modified julian date (ie, days since Jan .5 1900), d, return x, y, z
- * location of each Galilean moon as a multiple of Jupiter's radius. on this
- * scale, Callisto is never more than 26.5593. +x is easterly, +y is
- * southerly, +z is towards earth. x and z are relative to the equator
- * of Jupiter; y is further corrected for earth's position above or below
- * this plane. also, return the system I and II central meridian longitude,
- * in degress, relative to the true disk of jupiter and corrected for light
- * travel time.
- * from "Astronomical Formulae for Calculators", 2nd ed, by Jean Meeus,
- * Willmann-Bell, Richmond, Va., U.S.A. (c) 1982, chapters 35 and 36.
- */
- static
- jupinfo (d, ix, ex, gx, cx, iy, ey, gy, cy, iz, ez, gz, cz, sIcml, sIIcml)
- double d;
- double *ix, *ex, *gx, *cx;
- double *iy, *ey, *gy, *cy;
- double *iz, *ez, *gz, *cz;
- double *sIcml, *sIIcml;
- {
- double A, B, Del, J, K, M, N, R, V;
- double cor_u1, cor_u2, cor_u3, cor_u4;
- double solc, tmp, G, H, psi, r, r1, r2, r3, r4;
- double u1, u2, u3, u4;
- double lam, Ds;
- double z1, z2, z3, z4;
- double De, dsinDe;
-
- V = 134.63 + 0.00111587 * d;
-
- M = (358.47583 + 0.98560003*d);
- N = (225.32833 + 0.0830853*d) + 0.33 * dsin (V);
-
- J = 221.647 + 0.9025179*d - 0.33 * dsin(V);;
-
- A = 1.916*dsin(M) + 0.02*dsin(2*M);
- B = 5.552*dsin(N) + 0.167*dsin(2*N);
- K = (J+A-B);
- R = 1.00014 - 0.01672 * dcos(M) - 0.00014 * dcos(2*M);
- r = 5.20867 - 0.25192 * dcos(N) - 0.00610 * dcos(2*N);
- Del = sqrt (R*R + r*r - 2*R*r*dcos(K));
- psi = raddeg (asin (R/Del*dsin(K)));
-
- solc = (d - Del/173.); /* speed of light correction */
- tmp = psi - B;
-
- u1 = 84.5506 + 203.4058630 * solc + tmp;
- u2 = 41.5015 + 101.2916323 * solc + tmp;
- u3 = 109.9770 + 50.2345169 * solc + tmp;
- u4 = 176.3586 + 21.4879802 * solc + tmp;
-
- G = 187.3 + 50.310674 * solc;
- H = 311.1 + 21.569229 * solc;
-
- cor_u1 = 0.472 * dsin (2*(u1-u2));
- cor_u2 = 1.073 * dsin (2*(u2-u3));
- cor_u3 = 0.174 * dsin (G);
- cor_u4 = 0.845 * dsin (H);
-
- r1 = 5.9061 - 0.0244 * dcos (2*(u1-u2));
- r2 = 9.3972 - 0.0889 * dcos (2*(u2-u3));
- r3 = 14.9894 - 0.0227 * dcos (G);
- r4 = 26.3649 - 0.1944 * dcos (H);
-
- *ix = -r1 * dsin (u1+cor_u1);
- *ex = -r2 * dsin (u2+cor_u2);
- *gx = -r3 * dsin (u3+cor_u3);
- *cx = -r4 * dsin (u4+cor_u4);
-
- lam = 238.05 + 0.083091*d + 0.33*dsin(V) + B;
- Ds = 3.07*dsin(lam + 44.5);
- De = Ds - 2.15*dsin(psi)*dcos(lam+24.)
- - 1.31*(r-Del)/Del*dsin(lam-99.4);
- dsinDe = dsin(De);
-
- z1 = r1 * dcos(u1+cor_u1);
- z2 = r2 * dcos(u2+cor_u2);
- z3 = r3 * dcos(u3+cor_u3);
- z4 = r4 * dcos(u4+cor_u4);
-
- *iy = z1*dsinDe;
- *ey = z2*dsinDe;
- *gy = z3*dsinDe;
- *cy = z4*dsinDe;
-
- *iz = z1;
- *ez = z2;
- *gz = z3;
- *cz = z4;
-
- *sIcml = 268.28 + 877.8169088*(d - Del/173) + psi - B;
- range (sIcml, 360.0);
- *sIIcml = 290.28 + 870.1869088*(d - Del/173) + psi - B;
- range (sIIcml, 360.0);
- }
-